# -*-coding utf-8 -*-

__project__ = 'le-bo16'
__file_name__ = 'class10'
__author__ = 'hqDu'
__time__ = '2020-11-18 20:38'
__product_name = 'PyCharm'
# @fileName :class11.py

# 匿名函数
# lambda [arg1 [,arg2,.....argn]]:expression
# 匿名函数可以有任意数量的参数，但是只能返回一个表达式的值

# def fun(a,b):
#     return a + b
#
# print(fun(1,2))

# f = lambda a,b:a+b
# f(1,2)
# print(f(1,2))
#
# f1 = lambda a,b:print(a+b)
# f1(1,4)
#
# def getElem(elem):
#     return elem[1]
#
# my_list = [(1,3),(2,4),(5,6),(7,8)]
# print(my_list)
# for x in my_list:
#     print(getElem(x))

# 列表推导式，仅仅适用于列表
# [1,2,3.....100]
# 方法1：
# b = []
# for i in range(1,101):
#     b.append(i)
# print(i)
# 方法2：
# b = [x for x in range(1,101)]
# print(b)

# [1,2,3.....100] === [[1,2,3],[4,5,6],[7,8,9]...]
# 方法1：
# b = []
# a = [x for x in range(1,101)]
# for i in range(0,len(a),3):
#     ret = a[i:i+3]  # i=99时，a[99:102],但是报没有报索引越界；但是通过单一的索引去找值，就会报索引越界报错
#     b.append(ret)
# print(b)
# 方法2：
# a = [x for x in range(1,101)]
# b = [a[i:i+3] for i in range(0,len(a),3)]

# c = [1,2,3,4]
# # ret = c[10]  # 报错，索引越界；找位置
# ret1 = c[1:10]  # 没有报错；找范围，就算没有找到也不会报索引越界的错误
# ret2 = c[6:10]  # 没有报错；切片，找范围，
# print(ret1)
# print(ret2)


# set list tuple之间可以互相转化

# 文件
# open(文件名，访问模式)
# mode访问模式：r只读 w覆盖写入 a追加，不会覆盖
# encoding:必须写utf-8 指定新建文件的编码格式，防止中文出现乱码
# f = open('lebo.txt', mode='w', encoding='utf-8')
# f.write('hello\n')
# f.write('哈哈')  # 会覆盖
# 打开就要关闭，否则就会不断占用内存，而且CPU就会崩了。服务器不会自动关闭
# f.close()  # 关闭后，自动保存内容，释放内存

# 默认读取
# f.read()与f.readlines()都是将内容一次性读入内存，如果内容过大会导致内存溢出。
# f = open('lebo.txt',mode='r',encoding='utf-8')
# ret = f.read()  # 全部读取，以字符串的形式存在
# ret1 = f.readline()  # 读取一行，每一行都是一个字符串
# ret2 = f.readlines()  # 读取多行，并以列表的形式存在，列表内是字符串
# print(ret)
# f.close()
# 学生信息录入到文件中

# 对lebo.txt文件备份
# old_f = open('lebo.txt',encoding='utf-8')
# new_f = open('lebo01.txt', mode='w',encoding='utf-8')  # 创建一个新文件
# 将老文件内容拿出来，备份到新文件
# 列表，对于列表内的每一个元素都是字符串，所以需要遍历
# ret = old_f.readlines()  # 读取文件中的各行数据时，也会把换行符带上
# print(ret)
# # new_f.write(str(ret))  # str(list) 直接在列表加引号 '[1212,232,321321]'
# for i in ret:
#     new_f.write(i)  # write('str') 变量只能是字符串，所以需要把列表的内容一个个拿出来
# old_f.close()
# new_f.close()
#
# f = open('lebo01.txt',mode='r',encoding='utf-8')
# ret = f.read()
# print(ret)
# f.close()


# 编码与解码，增加数据的安全性
# 编码
# mode=wb
# 此处不可以有encoding，因为以二进制写入硬盘，并不需要在open里进行设置编码参数。
# 会在write写入encode()，将unicode类型的字符串转换成字节，encode()默认会有编码格式utf-8
f = open('lebo02.txt', mode='wb')
# f.write('哈哈')  # 报错，因为需要写入的数据必须是字节型；
# str.encode(encoding=‘utf-8或其他编码格式’)会按照编码将str变成byte字节类型
f.write('哈哈'.encode(encoding='utf-8'))  # encode()内即使没有encoding也ok，encode默认会有编码格式utf-8
f.close()
# 解码 mode=rb
f = open('lebo02.txt',mode='rb')
ret = f.read()  # 硬盘的二进制字节数据直接读入内存;返回以字符串形式存在的二进制数据
print(ret)  # b'\xe5\x93\x88\xe5\x93\x88'
# ret1 = f.read().decode(encoding='utf-8')  # 以rb形式读取数据时，需要decode操作；返回
# print(ret1)  # 哈哈
f.close()

# 1、文件操作时，以 “w”或“wb” 模式打开则只能写，并且在打开open的同时会先将内容清空；
# 2、写入到硬盘上时，必须是某种编码的0101010，打开时需要注意：
# （1）wb，写入时需要直接传入以某种编码的0100101，即：字节类型；如果要写入的字符串不是字节类型，需要进行encode()操作
# mode='wb'，open()内不可以出encoding
# （2）w 和 encoding，写入时需要传入unicode字符串，内部会根据encoding制定的编码将unicode字符串转换为该编码的010101010
# mode='w'，必须在open()内指明encoding

# 1、文件操作时，以 “r”或“rb” 模式打开，则只能读，无法写入；
# 2、硬盘上保存的文件都是某种编码的0101010，打开时需要注意：
# （1）rb，直接读取文件保存时原生的0101010，在Python中用字节类型表示；mode=’rb‘时，open()不能出现encoding
# （2）r和encoding，读取硬盘的0101010，并按照encoding指定的编码格式进行断句，
# 再将“断句”后的每一段0101010转换成unicode的 010101010101，在Python中用字符串类型表示；
# mode=‘r’时，open()一定要有encoding

# 1、mode='r'或‘w’
# （1）读写都是以字符串（unicode）为单位
# （2）只能针对文本文件
# （3）open必须指定字符编码，即必须指定encoding参数

# 2、mode='wb'或‘rb’或存在‘b’
# （1）读写都是以bytes为单位;写时需要将unicode的string进行encode成字节类型数据；读取时，需要对字节decode成unicode的string
# （2）可以针对所有文件（文件、视频、音乐、图片）
# （3）open一定不能指定字符编码，即一定不能指定encoding参数